package br.uvv.sao.rn;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.uvv.sao.dao.DisciplinaDAO;
import br.uvv.sao.dao.OfertaDisciplinaDAO;
import br.uvv.sao.dao.PalavraChaveDAO;
import br.uvv.sao.dao.ProvaDAO;
import br.uvv.sao.dao.QuestaoBaseDAO;
import br.uvv.sao.domain.Alternativa;
import br.uvv.sao.domain.AlternativaBase;
import br.uvv.sao.domain.Disciplina;
import br.uvv.sao.domain.OfertaDisciplina;
import br.uvv.sao.domain.PalavraChave;
import br.uvv.sao.domain.Prova;
import br.uvv.sao.domain.Questao;
import br.uvv.sao.domain.QuestaoBase;
import br.uvv.sao.enums.TipoGrauDificuldade;
import br.uvv.sao.util.DAOException;
import br.uvv.sao.util.RNException;

public class ProvaRN implements Serializable {
	
	private static final long serialVersionUID = -6010133091810637503L;
	
	private ProvaDAO provaDAO;
	private QuestaoBaseDAO questaoBaseDAO;

	public ProvaRN() {
		super();
		provaDAO = new ProvaDAO();
		questaoBaseDAO = new QuestaoBaseDAO();
	}
	
	public void salvar(Prova provaInstance) throws RNException {
		try {
			provaDAO.salvar(provaInstance);
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Salvar -> " + e.getMessage());
			throw new RNException(e);
		}
	}
	
	public void excluir(Prova provaInstance) throws RNException {
		try {
			provaDAO.excluir(provaInstance);
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Excluir -> " + e.getMessage());
			throw new RNException(e);
		}
	}

	public Prova selecionar(Long id) throws RNException {
		try {
			return provaDAO.selecionar(id);
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Selecionar -> " + e.getMessage());
			throw new RNException(e);
		}
	}
	
	public List<Prova> listar() throws RNException {
		try {
			return provaDAO.listar();
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Listar -> " + e.getMessage());
			throw new RNException(e);
		}
	}

	public List<Questao> listarQuestao(int first, int pageSize,
			String sortField, boolean sortOrder, Long idProva) throws RNException {
//		return questaoDAO.listarPorProva(first, pageSize, sortField, sortOrder, idProva);
		return null;
	}

	public List<Questao> listarQuestao(Long id) {
		// TODO Auto-generated method stub
		return null;
	}

	public List<Prova> listar(int first, int pageSize, String sortField,
			boolean sortOrder, String varBuscaCodigo, String varBuscaDescricao) throws RNException {
		try {
			return provaDAO.listar(first, pageSize, sortField, sortOrder, varBuscaCodigo, varBuscaDescricao);
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Listar Paginado -> " + e.getMessage());
			throw new RNException(e);
		}
	}

	public String gerarCodigoProva() {
		Integer temp = 1;
		try {
			temp = provaDAO.rowCount();
			temp++;
		} catch (DAOException e) { }
		String tempStr = temp.toString();
		while (tempStr.toString().length()<3){
			tempStr = "0" + tempStr; 
		}
		String codProva = "PV" + new SimpleDateFormat("yyMM").format(new Date()) + tempStr;
		return codProva;
	}

	public List<Disciplina> listarDisciplinas() throws RNException {
		DisciplinaDAO disciplinaDAO = new DisciplinaDAO();
		try {
			return disciplinaDAO.listar();
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Listar Disciplinas -> " + e.getMessage());
			throw new RNException(e);
		}
	}

	public List<OfertaDisciplina> listarOfertaDisciplina(int first,
			int pageSize, String sortField, boolean sortOrder,
			Long idDisciplina, Long idProfessor, String buscaSemestre, Date buscaAno) throws RNException {
		try {
			OfertaDisciplinaDAO ofertaDisciplinaDAO = new OfertaDisciplinaDAO();
			return ofertaDisciplinaDAO.listar(first, pageSize, sortField, sortOrder, 
					idDisciplina, idProfessor, buscaSemestre, buscaAno);
		} catch (DAOException e) {
			System.out.println("ERRO/RN - Listar Paginado -> " + e.getMessage());
			throw new RNException(e);
		}
	}

	public List<QuestaoBase> listarQuestaoBase(int first, int pageSize,
			String sortField, boolean sortOrder) throws RNException {
		return null;
	}

	public void salvarAssunto(PalavraChave assuntoInstance) throws RNException {
		PalavraChaveDAO dao = new PalavraChaveDAO();
		try {
			dao.salvar(assuntoInstance);
		} catch (DAOException e) {
			throw new RNException(e);
		}
	}

	public Questao transformarQuestaoBaseEmQuestao(
			QuestaoBase questaoBaseInstance) {
		Questao questaoInstance = new Questao();
		questaoInstance.setAlternativas(transformarAlternativaBaseEmAlternativa(questaoInstance, questaoBaseInstance.getAlternativas()));
		questaoInstance.setAlternativaCorreta(transformarAlternativaCorreta(questaoBaseInstance.getAlternativaCorreta()));
		questaoInstance.setCabecalho(questaoBaseInstance.getCabecalho());
		questaoInstance.setCodigo(questaoBaseInstance.getCodigo());
		questaoInstance.setGrauDificuldade(questaoBaseInstance.getGrauDificuldade());
		questaoInstance.setPalavraChave(questaoBaseInstance.getPalavraChave());
		questaoInstance.setProfessor(questaoBaseInstance.getProfessor());
		questaoInstance.setProvas(null);
		questaoInstance.setQuestaoBase(questaoBaseInstance);
		questaoInstance.setVersion(0);
		return questaoInstance;
	}
	
	private List<Alternativa> transformarAlternativaBaseEmAlternativa(Questao questaoInstance, List<AlternativaBase> alterantivaBaseList){
		List<Alternativa> alternativaList = new ArrayList<Alternativa>();
		Alternativa alternativaInstance;
		for (AlternativaBase alternativaBaseInstance:alterantivaBaseList){
			alternativaInstance = new Alternativa();
			alternativaInstance.setQuestao(questaoInstance);
			alternativaInstance.setTexto(alternativaBaseInstance.getTexto());
			alternativaList.add(alternativaInstance);
		}
		return alternativaList;
	}
	
	private Alternativa transformarAlternativaCorreta(AlternativaBase alternativaBaseInstance){
		Alternativa alternativaInstance = new Alternativa();
		alternativaInstance.setTexto(alternativaBaseInstance.getTexto());
		return alternativaInstance;
	}
	
	public String gerarCodigoQuestaoBase() {
		Integer temp = 1;
		try {
			temp = questaoBaseDAO.rowCount();
			temp++;
		} catch (DAOException e) { }
		String tempStr = temp.toString();
		while (tempStr.toString().length()<3){
			tempStr = "0" + tempStr; 
		}
		String codQuestao = "QT" + new SimpleDateFormat("yyMM").format(new Date()) + tempStr;
		return codQuestao;
	}

	public void salvarQuestaoBase(QuestaoBase questaoBaseInstance) throws RNException {
		
	}

	public List<PalavraChave> listarPalavraChave(String nomePalavraChave) {
		PalavraChaveDAO palavraChaveDAO = new PalavraChaveDAO();
		try {
			return palavraChaveDAO.listar(nomePalavraChave);
		} catch (DAOException e) {
			e.printStackTrace();
			return null;
		}
	}

	public List<QuestaoBase> listarQuestaoBase(int first, int pageSize,
			String sortField, boolean sortOrder, String varCabecalho, 
			TipoGrauDificuldade varDificuldade, Long varIdAssunto) throws RNException {
		try {
			return questaoBaseDAO.listar(first, pageSize, sortField, sortOrder, varCabecalho, varDificuldade, varIdAssunto);
		} catch (DAOException e) {
			e.printStackTrace();
			throw new RNException(e);
		}
	}
}